sitepoint.com의 Node.js 관련 Article 번역

  1. [번역] An Introduction to Node.js

원문 sitepoint.comCreating a HTTP Server in Node.js(http://sitepoint.com/creating-a-http-server-in-node-js/)

오역 주의 오역을 발견하시면 꼭 알려주세요~ :-)

Creating a HTTP Server in Node.js

최근에 작성한 글에서 가장 기본적인 Node.js 프로그램을 소개했었다. 물론 Hello World 프로그램도 괜찮지만, 사실 Node.js는 높은 성능의 확장 가능한 서버 애플리케이션을 작성하기 위한 것으로 더 많이 알려졌다. 이 글에서는 Node.js로 만든 간단한 HTTP 서버를 소개한다.

Running the Server

우선 “web_server.js”라는 파일을 만들고 아래의 코드를 작성 후 저장하자.

var http = require("http");
var server = http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/html"});
  response.write("<!DOCTYPE \"html\">");
  response.write("<html>");
  response.write("<head>");
  response.write("<title>Hello World Page</title>");
  response.write("</head>");
  response.write("<body>");
  response.write("Hello World!");
  response.write("</body>");
  response.write("</html>");
  response.end();
});
server.listen(80);
console.log("Server is listening");

이 서버를 구동시키려면 아래의 명령어를 실행해라. 정상적으로 실행이 된다면 “Server is listening”이라는 메시지를 보게될 것이다. 예제의 서버가 HTTP의 표준 포트인 80번 포트에 바인딩하고 있다는 것에 주목하자. 이 포트가 시스템에서 이미 사용중이거나 제한되어 있다면 에러가 발생할 것이다.

$ node web_server.js

다음은 웹 브라우저를 사용해서 서버에 연결해 볼 차례이다. 원하는 브라우저를 실행하고 다음 링크 중 하나를 직접 연결한다. 네트워크 측면에서 localhost(및 로컬호스트의 IP인 127.0.0.1)는 현재 사용중인 시스템을 가르킨다. 브라우저가 “Hello World!”라고 보여주면 정상인 것이다.

http://localhost
http://127.0.0.1

How the Server Works

이제 서버가 이상없이 실행되고 있으니 코드를 분석해 볼 차례이다. 첫번째로 살펴봐야 할 것은 1 라인에서 require()를 호출하고 있다는 것이다. Node.js는 대형 개발자 커뮤니티를 통해 간단한 모듈 시스템을 제공한다. Node.js 프로그램은 require() 메서드를 사용해서 각각의 모듈을 로드할 수 있다. 많은 모듈들의 경우 다운로드해서 사용해야 하지만, http와 같은 특정 모듈들은 Node.js 설치 시 포함되어 있다.

2 라인에서는 http 모듈의 createServer() 메서드를 사용해서 HTTP 서버를 생성했다. 대부분의 Node.js 함수와 마찬가지로 createServer() 도 콜백 함수를 인자로 받는다. 이 콜백 함수는 서버가 새로운 요청을 받을때마다 매번 실행된다.

이 콜백 함수에서는 requestresponse라는 두개의 인자를 받는다. request 객체는 URL, HTTP 헤더 등과 같은 클라이언트의 요청에 관한 정보를 포함하고 있다. 마찬가지로 response 객체는 클라이언트에게 데이터를 돌려보내는데 사용한다.

위 콜백 함수는 response.writeHead() 메서드의 호출로 시작한다. 이 메서드는 클라이언트에 HTTP 상태 코드response 헤더의 컬렉션을 보낸다. 여기서 상태 코드라는 것은 요청에 대한 결과를 가르키는 것이다. 예를 들면, 모든 사람들이 “페이지를 찾을 수 없다”는 것을 나타내는 404 에러를 만난 적이 있을 것이다. 위 예제의 서버는 “성공”을 나타내는 200 코드를 반환한다.

그 상태 코드에 따라서 서버는 응답의 파라미터들을 정의하고 있는 여러 HTTP 헤더를 반환하게 된다. 직접 헤더를 명시하지 않아도 Node.js는 암묵적으로 헤더를 전송한다. 예제의 서버는 Content-Type 헤더만을 명시하고 있다. 이 헤더는 응답의 MIME 타입을 정의한다. 응답이 HTML인 경우에 MIME 타입은 “text/html”이다.

다음으로 서버는 response.write()를 여러번 호출한다. 이것은 HTML 페이지를 작성하기 위해서 사용되는 것이다. 기본적으로 UTF-8 문자셋으로 인코딩된다. 성능 향상을 위해 기술적으로는 하나의 호출로 합치면 좋겠지만, 이 정도의 예제에서는 코드 가독성을 위해서 성능은 신경쓰지 않았다.

HTML 페이지를 모두 작성한 후에는 response.end() 메서드를 호출한다. 이 메서드를 호출함으로써 응답 헤더와 본문이 전송되고 요청에 대한 처리가 완료된다. 예제의 서버에서는 아무 파라미터 없이 end()를 호출하지만, 단지 한번의 호출만 필요하다고 가정한다면 write()와 같은 방식으로 호출될 수 있다.

15 라인에서는 listen()을 호출하여 서버에 포트를 바인딩하고 연결 요청을 리스닝하게 된다. 컴퓨터들은 종단간 통신에 사용되는 수천개의 포트를 가지고 있다. 서버에 연결하기 위해서는 클라이언트들은 서버가 리스닝하고 있는 포트를 정확히 알아야만 한다. HTTP 서버가 전통적으로 80번 포트를 사용하듯이 포트들은 각각의 포트 번호로써 식별된다.

Conclusion

이 글에서는 아주 기본적인 HTTP 서버를 보여줬다. 현재 상태로는 서버가 하나의 HTML 페이지만을 반환할 뿐이다. 다음주에는 파일 시스템으로부터 웹 페이지를 읽거나 HTTP 인증을 통합하는 것과 같은 추가적인 특성에 대해서 살펴보는 등 Node.js에 대해서 더 자세히 알아볼 것이다.


About Author

Juhoi Kim
blog: http://juhoi.github.io
twitter: @ByJuhoi
github: juhoi

모든 것은 나의 선택에 달려있다.